package com.javayh.api.order.service.impl;

import com.javayh.api.service.IOrderService;
import com.javayh.server.IConsumerService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author Dylan Yang
 * @Title: OrderServiceImpl
 * @ProjectName demo
 * @Description: TODO
 * @date 2018/11/1817:09
 */
@RestController
public class OrderServiceImpl implements IOrderService {

    @Autowired
    private IConsumerService consumerService;

    // 订单服务接口
    @GetMapping("/orderInfo")
    public String orderInfo() {
        System.out.println("orderInfo:" + "线程池名称:" + Thread.currentThread().getName());
        return "1234";
    }

    //////////////////////////////////////////////////////////////////////////////
    ///////////////////////////解决服务雪崩效应方案////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////

    //方案一: 通过@HystrixCommand注解，但是代码冗余
    /**
     * 	fallbackMethod 方法的作用：服务降级执行
     * 	@HystrixCommand 默认开启线程池隔离方式,服务降级,服务熔断
     * 	设置Hystrix服务超时时间
      * @author Dylan Yang
      */
    @HystrixCommand(fallbackMethod = "orderToConsumerHystrixFallback")
    @GetMapping("/orderToConsumerHystrix")
    public String orderToConsumerHystrix() {
        System.out.println("orderToConsumerHystrix:" + "线程池名称:" + Thread.currentThread().getName());
        return consumerService.getUserInfo();
    }

    //此代码将大量出现在每一个服务内
    public String orderToConsumerHystrixFallback() {
        return "返回一个友好的提示：服务降级,服务器忙，请稍后重试!";
    }

    /**
      * 通过Feign实现，推荐使用
      *  将fallback 封装
      * @author Dylan Yang
      */
    @GetMapping("/orderToFeign")
    public String orderToFeign() {
        System.out.println("orderToFeign:" + "线程池名称:" + Thread.currentThread().getName());
        return consumerService.getUserInfo();
    }

}

